package com.yilizhiyou.service;

import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 天气服务类
 * 提供实时天气数据获取功能
 * 
 * @author 伊犁智游开发团队
 * @since 1.0.0
 */
@Service
public class WeatherService {
    
    private final Random random = new Random();
    
    // 模拟天气数据（实际项目中应该调用真实的天气API）
    private final String[] weatherConditions = {"晴", "多云", "阴", "小雨", "中雨", "大雨", "雪", "雾"};
    
    /**
     * 根据经纬度获取天气信息
     * 
     * @param longitude 经度
     * @param latitude 纬度
     * @return 天气信息Map
     */
    public Map<String, Object> getWeatherByCoordinates(Double longitude, Double latitude) {
        Map<String, Object> weatherInfo = new HashMap<>();
        
        try {
            // 模拟根据经纬度获取天气数据
            // 实际项目中这里应该调用真实的天气API，如OpenWeatherMap、和风天气等
            
            // 根据伊犁地区的特点，模拟合理的天气数据
            String condition = getWeatherConditionByLocation(longitude, latitude);
            Integer temperature = getTemperatureByLocation(longitude, latitude);
            String icon = getWeatherIcon(condition);
            
            weatherInfo.put("condition", condition);
            weatherInfo.put("temperature", temperature);
            weatherInfo.put("icon", icon);
            weatherInfo.put("humidity", 45 + random.nextInt(30)); // 湿度 45-75%
            weatherInfo.put("windSpeed", 5 + random.nextInt(15)); // 风速 5-20 km/h
            weatherInfo.put("updateTime", System.currentTimeMillis());
            
        } catch (Exception e) {
            // 如果获取天气失败，返回默认数据
            weatherInfo.put("condition", "晴");
            weatherInfo.put("temperature", 20);
            weatherInfo.put("icon", "☀️");
            weatherInfo.put("humidity", 50);
            weatherInfo.put("windSpeed", 10);
            weatherInfo.put("updateTime", System.currentTimeMillis());
        }
        
        return weatherInfo;
    }
    
    /**
     * 根据景点名称获取天气信息
     * 
     * @param spotName 景点名称
     * @param longitude 经度
     * @param latitude 纬度
     * @return 天气信息Map
     */
    public Map<String, Object> getWeatherBySpotName(String spotName, Double longitude, Double latitude) {
        Map<String, Object> weatherInfo = getWeatherByCoordinates(longitude, latitude);
        
        // 根据景点特点调整天气描述
        String enhancedDescription = getEnhancedWeatherDescription(spotName, weatherInfo.get("condition").toString());
        weatherInfo.put("description", enhancedDescription);
        
        return weatherInfo;
    }
    
    /**
     * 根据位置获取天气状况
     */
    private String getWeatherConditionByLocation(Double longitude, Double latitude) {
        // 根据伊犁地区的特点，模拟不同区域的天气
        if (longitude != null && latitude != null) {
            // 草原地区（那拉提、昭苏）多晴天
            if (latitude > 43.0 && latitude < 43.5) {
                return random.nextDouble() < 0.7 ? "晴" : weatherConditions[random.nextInt(weatherConditions.length)];
            }
            // 山区（夏塔古道）多云雾
            else if (latitude < 43.0) {
                return random.nextDouble() < 0.6 ? "多云" : weatherConditions[random.nextInt(weatherConditions.length)];
            }
            // 河谷地区（伊犁河谷）天气多变
            else {
                return weatherConditions[random.nextInt(weatherConditions.length)];
            }
        }
        
        return weatherConditions[random.nextInt(weatherConditions.length)];
    }
    
    /**
     * 根据位置获取温度
     */
    private Integer getTemperatureByLocation(Double longitude, Double latitude) {
        // 根据伊犁地区的特点，模拟不同区域的温度
        if (longitude != null && latitude != null) {
            // 草原地区温度适中
            if (latitude > 43.0 && latitude < 43.5) {
                return 15 + random.nextInt(15); // 15-30度
            }
            // 山区温度较低
            else if (latitude < 43.0) {
                return 5 + random.nextInt(15); // 5-20度
            }
            // 河谷地区温度较高
            else {
                return 18 + random.nextInt(12); // 18-30度
            }
        }
        
        return 15 + random.nextInt(15); // 默认15-30度
    }
    
    /**
     * 根据天气状况获取图标
     */
    private String getWeatherIcon(String condition) {
        switch (condition) {
            case "晴": return "☀️";
            case "多云": return "⛅";
            case "阴": return "☁️";
            case "小雨": return "🌦️";
            case "中雨": return "🌧️";
            case "大雨": return "⛈️";
            case "雪": return "❄️";
            case "雾": return "🌫️";
            default: return "☀️";
        }
    }
    
    /**
     * 根据景点特点增强天气描述
     */
    private String getEnhancedWeatherDescription(String spotName, String condition) {
        if (spotName.contains("草原") || spotName.contains("那拉提") || spotName.contains("昭苏")) {
            switch (condition) {
                case "晴": return "草原阳光明媚，适合骑马和拍照";
                case "多云": return "草原云层较多，光线柔和，适合摄影";
                case "小雨": return "草原细雨蒙蒙，空气清新";
                default: return "草原天气" + condition + "，请注意保暖";
            }
        } else if (spotName.contains("湖") || spotName.contains("赛里木")) {
            switch (condition) {
                case "晴": return "湖面波光粼粼，景色绝美";
                case "多云": return "湖面云雾缭绕，如诗如画";
                case "小雨": return "湖面雨滴点点，别有一番韵味";
                default: return "湖面天气" + condition + "，请注意安全";
            }
        } else if (spotName.contains("山") || spotName.contains("古道")) {
            switch (condition) {
                case "晴": return "山间阳光充足，视野开阔";
                case "多云": return "山间云雾缭绕，仙境一般";
                case "小雨": return "山间细雨绵绵，空气湿润";
                default: return "山间天气" + condition + "，请注意防滑";
            }
        } else {
            return "当前天气" + condition + "，适合游览";
        }
    }
}
